/******************************************************************************
秋夜静，独坐对残灯。
啼笑非非谁识我，坐行梦梦尽缘君，何所慰消沉。
风卷雨，雨复卷侬心。
心似欲随风雨去，茫茫大海任浮沉。
无爱亦无恨。
******************************************************************************/
#ifndef _KB_RGB_H_
#define _KB_RGB_H_

#include <stdint.h>
#include "kbRGB_Angle.h"
#include "Curve/hsv.h"
#include "UGUI/ugui.h"
#include "SimplexNoises.h"

#ifdef __cplusplus
extern "C" {
#endif

#if 1
#define KB_ROWS KBRGB_ANGLE_SIZE
#else
#define KB_ROWS 6
#endif
#define KB_COLS KBRGB_ANGLE_SIZE

/*************************************************************************************************\
|        Advanced [13]                                                                            |
\*************************************************************************************************/
struct kbRGB_BouncingBall{
    double x,y;
};
#define KBRGB_RAIN_SIZE   (10)
struct kbRGB_Drop
{
    double progress;
    uint32_t color;
    unsigned int col;
    float speed_mult;
    //uint32_t progress;
    //uint16_t speed_mult;
};
//struct SmoothBlink_t{
//    uint32_t current_color_1;
//    uint32_t current_color_2;
//    uint32_t random_color_1;
//    uint32_t random_color_2;
//    uint32_t next_color_1;
//    uint32_t next_color_2;
//    float pulses_total_duration;
//    float total_effect_duration;
//    float value;// = 1.0;
//    double random_fade_timer;// = 0;
//};
struct NewStar {
    //unsigned int      Index;
    uint32_t            Color;
    uint16_t            LED;
    // 注: state的计算包含大量浮点运算,这里转换为整形计算,精度为 1/64
    //float             state;
    int16_t             state; // *64 2^6
};

/*************************************************************************************************\
|        Beams [2]                                                                                |
\*************************************************************************************************/
struct kbRGB_Beams_t{
    hsv_t hsv1;
    hsv_t hsv2;
    uint16_t hsv_hue1;
    uint16_t hsv_hue2;
//    double sine_x;// = 0;
//    double sine_y;// = 0;
    int v_speed;// = 10;
    int h_speed;// = 15;
    int glow;// = 30;
    int thickness;// = 1;
    int RotatingMode;
};
/*************************************************************************************************\
|        Random [2]                                                                               |
\*************************************************************************************************/
struct kbRGB_Flower {
    uint32_t hue:22;
    uint32_t speed_mult:10;// = 1.f;
};
struct kbRGB_Lightning_t {
    hsv_t hsv;
    uint16_t id;
};
#define LightningsSizeMax   32

/*************************************************************************************************\
|        Simple [11]                                                                              |
\*************************************************************************************************/
/*************************************************************************************************\
|        Mosaic [9]                                                                               |
\*************************************************************************************************/
struct kbRGB_Mosaic_t {
    //hsv_t hsv;
    //float brightness;// = 0.f;
    uint16_t brightness;// = 0.f;
    //float decrease_speed_mult;// = 1.f;
    uint16_t decrease_speed_mult;// = 1.f;
};
/*************************************************************************************************\
|        MotionPoints [9]                                                                              |
\*************************************************************************************************/
enum kbRGB_Dir {
    LEFT = 0,
    RIGHT = 1,
    UP = 2,
    DOWN = 3
};
struct kbRGB_MovingPoint
{
    float x;// = 0.f;
    float y;// = 0.f;

    float speed_mult;// = 1.f;

    enum kbRGB_Dir dir;

    uint32_t color;
};
#define kbRGB_pointsSize    8

struct kbRGB_Params {
    unsigned int FPS;
    unsigned int Speed;
    unsigned int Slider2Val;
    double progress;
    double time;
    uint32_t background;
    int reverse;
    //int frequency;
    hsv_t hsv;
    uint32_t UserColors[8];

    union {
        /*************************************************************************************************\
        |        Advanced [13-1]                                                                          |
        \*************************************************************************************************/
        struct {
            int radius;
            int gravity;
            int dropHeightPercent;
            int spectrumVelocity;
            int horizontalVelocity;
            struct kbRGB_BouncingBall Ball;
        }BouncingBall;
        int spread;// = 0;
        struct {
            struct kbRGB_Drop drops[KBRGB_RAIN_SIZE];
            uint16_t dropsSize;//=0;
        }Rain;
        struct {
            uint32_t current_color_1;
            uint32_t current_color_2;
            uint32_t random_color_1;
            uint32_t random_color_2;
            uint32_t next_color_1;
            uint32_t next_color_2;
            //float pulses_total_duration;
            //float total_effect_duration;
            float value;// = 1.0;
            double random_fade_timer;// = 0;
            //float interval;// = 2.0;
            float strength;// = 0.5;
            //unsigned int pulses;// = 2;
            float pulse_duration;// = 0.5;
            int rendering;// = Circle;
        }SmoothBlink;
        struct {
            struct NewStar CurrentStars[20];
            uint16_t CurrentStarsSize;//=0;
        }StarryNight;  // 星空
        struct {
            int        Dir;// = 1 ;
            float      SineProgress;//      = 10.0f;
            float      WaveProgress;//      = 60.0f;
            float      WaveFrequency;//     = 2;
            float      WaveSpeed;//         = 30;
            float      OscillationSpeed;//  = 50;
        }Wavy;
        /*************************************************************************************************\
        |        Beams [2]                                                                                |
        \*************************************************************************************************/
        struct kbRGB_Beams_t Beams;
        /*************************************************************************************************\
        |        Rainbow [9-1]                                                                            |
        \*************************************************************************************************/
        struct {
            int octaves;// = 2;
            int motion;// = 0;
            int motion_speed;// = 1;
            struct SimplexNoise_t Noise;
        }Rainbow_NoiseMap;
        struct {
            int frequency;
            unsigned int shape;
        }Rainbow;
        struct {
            float animation_speed;// = 10.f;
            float color_rotation_speed;// = 50.f;
            unsigned int animation_direction;// = 0;
            unsigned int color_rotation_direction;// = 0;
            unsigned int spacing;// = 1;
            unsigned int thickness;// = 1;
        }RainbowHypn;
        /*************************************************************************************************\
        |        Random [2]                                                                               |
        \*************************************************************************************************/
        struct kbRGB_Flower Random_flowers[KB_COLS*KB_ROWS];
        struct {
            struct kbRGB_Lightning_t Lightnings[LightningsSizeMax];
            uint32_t mode;
        }Random_Lightning;
        /*************************************************************************************************\
        |        Simple [11]                                                                              |
        \*************************************************************************************************/
        struct {
            struct kbRGB_Mosaic_t tiles[KB_COLS*KB_ROWS];
            struct kbRGB_MovingPoint points[kbRGB_pointsSize];
            unsigned int stops;//=0;
            int horizontal;
            uint32_t old_dir;// = 0;
        }Simple;
		struct kbRGB_Mosaic_t SimpleTiles[KB_COLS*KB_ROWS];
        double Simple_Fill_old_progress;// = 0;
    };
};
#define KB_RGB_EFFECTS    36
struct kbRGB_Effect_t {
    void (*const Init)(void);
    void (*const Effect)(const uint16_t cols, const uint16_t rows);
};

extern uint32_t tb_get_sys_time_ms(void);

extern void kbRGB_Init(void);
extern void kbRGB_Params_Init(void);
//清屏函数
extern void kbRGB_clear(void);
extern void kbRGB_full(const uint32_t color);
extern void kbRGB_pset(UG_S16 x, UG_S16 y, UG_COLOR t);
extern uint32_t kbRGB_get_point(UG_S16 x, UG_S16 y);
extern const uint32_t* kbRGB_get_frame_buffer(void);

extern struct kbRGB_Params kbrgb_Params;
#define kbRGB_FPS              (kbrgb_Params.FPS)
#define kbRGB_Speed            (kbrgb_Params.Speed)
#define kbRGB_Slider2Val       (kbrgb_Params.Slider2Val)
#define kbRGB_progress         (kbrgb_Params.progress)
#define kbRGB_time             (kbrgb_Params.time)
#define kbRGB_PRE_BIT          8
#define kbRGB_PRE_MAX          255

/*************************************************************************************************\
|        Advanced [13]                                                                            |
\*************************************************************************************************/
//effect = new BouncingBallEffect();      // 弹力球
//effect = new Bubbles();                 // 气泡
//effect = new FractalMotion();           // 分形运动
//effect = new GradientWave();            // 梯度波
//effect = new MovingPanes();             // 移动窗格
//effect = new Rain();                    // 下雨
//effect = new SmoothBlink();             // 平滑闪烁
//effect = new Spiral();                  // 螺旋
//effect = new StarryNight();             // 星空
//effect = new Sunrise();                 // 日出   // Fail
//effect = new SwirlCircles();            // 漩涡圈
//effect = new Wavy();                    // 波形的
//effect = new ZigZag();                  // 之字形的
extern void kbRGB_BouncingBallEffect_Init(void); // 弹力球
extern void kbRGB_BouncingBallEffect(const uint16_t cols, const uint16_t rows); // 弹力球
extern void kbRGB_Bubbles_Init(void);            // 气泡
extern void kbRGB_Bubbles(const uint16_t cols, const uint16_t rows);            // 气泡
extern void kbRGB_FractalMotion_Init(void);      // 分形运动
extern void kbRGB_FractalMotion(const uint16_t cols, const uint16_t rows);      // 分形运动
extern void kbRGB_GradientWave_Init(void);       // 梯度波
extern void kbRGB_GradientWave(const uint16_t cols, const uint16_t rows);       // 梯度波
extern void kbRGB_MovingPanes_Init(void);        // 移动窗格
extern void kbRGB_MovingPanes(const uint16_t cols, const uint16_t rows);        // 移动窗格
extern void kbRGB_Rain_Init(void);               // 下雨
extern void kbRGB_Rain(const uint16_t cols, const uint16_t rows);               // 下雨
extern void kbRGB_SmoothBlink_Init(void);        // 平滑闪烁
extern void kbRGB_SmoothBlink(const uint16_t cols, const uint16_t rows);        // 平滑闪烁
extern void kbRGB_Spiral_Init(void);             // 螺旋效果
extern void kbRGB_Spiral(const uint16_t cols, const uint16_t rows);             // 螺旋效果
extern void kbRGB_StarryNight_Init(void);        // 星空
extern void kbRGB_StarryNight(const uint16_t cols, const uint16_t rows);        // 星空
extern void kbRGB_Sunrise_Init(void);            // 日出   // Fail
extern void kbRGB_Sunrise(const uint16_t cols, const uint16_t rows);            // 日出   // Fail
extern void kbRGB_SwirlCircles_Init(void);       // 漩涡圈
extern void kbRGB_SwirlCircles(const uint16_t cols, const uint16_t rows);       // 漩涡圈
extern void kbRGB_Wavy_Init(void);               // 波形的
extern void kbRGB_Wavy(const uint16_t cols, const uint16_t rows);               // 波形的
extern void kbRGB_ZigZag_Init(void);             // 之字形的
extern void kbRGB_ZigZag(const uint16_t cols, const uint16_t rows);             // 之字形的

/*************************************************************************************************\
|        Beams [2]                                                                                |
\*************************************************************************************************/
//effect = new CrossingBeams();           // 交叉梁
//effect = new RotatingBeam();            // 旋转射束
extern void kbRGB_CrossingBeams_Init(void);      // 交叉梁
extern void kbRGB_CrossingBeams(const uint16_t cols, const uint16_t rows);      // 交叉梁
extern void kbRGB_RotatingBeam_Init(void);       // 旋转射束
extern void kbRGB_RotatingBeam(const uint16_t cols, const uint16_t rows);       // 旋转射束

/*************************************************************************************************\
|        Rainbow [9]                                                                              |
\*************************************************************************************************/
//effect = new ColorWheelEffect();        // 色轮
//effect = new CustomGradientWave();      // 自定义梯度波   // Fail
//effect = new DoubleRotatingRainbow();   // 双旋转彩虹
//effect = new Hypnotoad();               //
//effect = new NoiseMap();                // 噪声地图
//effect = new RadialRainbow();           // 径向彩虹
//effect = new RainbowWave();             // 彩虹波
//effect = new RotatingRainbow();         // 旋转的彩虹
//effect = new SpectrumCycling();         // 光谱骑自行车
extern void kbRGB_ColorWheel_Init(void);        // 色轮
extern void kbRGB_ColorWheel(const uint16_t cols, const uint16_t rows);         // 色轮
//extern void CustomGradientWave_Init(void);         // 自定义梯度波   // Fail
//extern void CustomGradientWave(const uint16_t cols, const uint16_t rows);     // 自定义梯度波   // Fail
extern void kbRGB_DoubleRotatingRainbow_Init(void);        // 双旋转彩虹
extern void kbRGB_DoubleRotatingRainbow(const uint16_t cols, const uint16_t rows); // 双旋转彩虹
extern void kbRGB_Hypnotoad_Init(void);                  // Hypnotoad
extern void kbRGB_Hypnotoad(const uint16_t cols, const uint16_t rows);          // Hypnotoad
extern void kbRGB_NoiseMap_Init(void);                   // 噪声地图
extern void kbRGB_NoiseMap(const uint16_t cols, const uint16_t rows);           // 噪声地图
extern void kbRGB_NoiseCircle_Init(void);                // 噪声地图
extern void kbRGB_NoiseCircle(const uint16_t cols, const uint16_t rows);        // 噪声地图
extern void kbRGB_RadialRainbow_Init(void);                // 径向彩虹
extern void kbRGB_RadialRainbow(const uint16_t cols, const uint16_t rows);      // 径向彩虹
extern void kbRGB_RainbowWave_Init(void);                  // 彩虹波
extern void kbRGB_RainbowWave(const uint16_t cols, const uint16_t rows);        // 彩虹波
extern void kbRGB_RotatingRainbow_Init(void);              // 旋转的彩虹
extern void kbRGB_RotatingRainbow(const uint16_t cols, const uint16_t rows);    // 旋转的彩虹
extern void kbRGB_SpectrumCycling_Init(void);              // 光谱骑自行车
extern void kbRGB_SpectrumCycling(const uint16_t cols, const uint16_t rows);    // 光谱骑自行车

/*************************************************************************************************\
|        Random [2]                                                                               |
\*************************************************************************************************/
//effect =  new Bloom();                  // 花朵
//effect = new Lightning();               // 闪电
extern void kbRGB_Bloom_Init(void);                                             // 花朵
extern void kbRGB_Bloom(const uint16_t cols, const uint16_t rows);              // 花朵
extern void kbRGB_Lightning_Init(void);                                         // 闪电
extern void kbRGB_Lightning(const uint16_t cols, const uint16_t rows);          // 闪电

/*************************************************************************************************\
|        Simple [11]                                                                              |
\*************************************************************************************************/
//effect = new Breathing();               // 呼吸
//effect = new BreathingCircle();         // 呼吸循环
//effect = new Comet();                   // 彗星
//effect = new Fill();                    // 充满
//effect = new Marquee();                 // 大天幕
//effect = new Mosaic();                  // 马赛克
//effect = new MotionPoint();             // 运动点
//effect = new MotionPoints();            // 运动点
//effect = new Stack();                   // 堆
//effect = new Swap();                    // 交换
//effect = new Visor();                   // 遮阳板
extern void kbRGB_Breathing_Init(void);          // 呼吸
extern void kbRGB_Breathing(const uint16_t cols, const uint16_t rows);          // 呼吸
extern void kbRGB_BreathingCircle_Init(void);    // 呼吸循环
extern void kbRGB_BreathingCircle(const uint16_t cols, const uint16_t rows);    // 呼吸循环
extern void kbRGB_Comet_Init(void);              // 彗星
extern void kbRGB_Comet(const uint16_t cols, const uint16_t rows);              // 彗星
extern void kbRGB_Fill_Init(void);               // 充满
extern void kbRGB_Fill(const uint16_t cols, const uint16_t rows);               // 充满
extern void kbRGB_Marquee_Init(void);            // 大天幕
extern void kbRGB_Marquee(const uint16_t cols, const uint16_t rows);            // 大天幕
extern void kbRGB_Mosaic_Init(void);             // 马赛克
extern void kbRGB_Mosaic(const uint16_t cols, const uint16_t rows);             // 马赛克
extern void kbRGB_MotionPoint_Init(void);        // 运动点
extern void kbRGB_MotionPoint(const uint16_t cols, const uint16_t rows);        // 运动点
extern void kbRGB_MotionPoints_Init(void);       // 运动点
extern void kbRGB_MotionPoints(const uint16_t cols, const uint16_t rows);       // 运动点
extern void kbRGB_Stack_Init(void);              // 堆
extern void kbRGB_Stack(const uint16_t cols, const uint16_t rows);              // 堆
extern void kbRGB_Swap_Init(void);               // 交换
extern void kbRGB_Swap(const uint16_t cols, const uint16_t rows);               // 交换
extern void kbRGB_Visor_Init(void);              // 遮阳板
extern void kbRGB_Visor(const uint16_t cols, const uint16_t rows);              // 遮阳板


extern const struct kbRGB_Effect_t kbrgb_effect[KB_RGB_EFFECTS];

#ifdef __cplusplus
}
#endif

#endif // _KB_RGB_H_
